/*
  对axios进行二次封装，完成以下功能：
   1. 复用请求地址前缀 /api
   2. 复用公共请求参数 token
   3. 成功就是功能成功
      功能成功直接得到数据
   4. 失败就是请求失败或功能失败
      失败直接进行错误提示
   5. 请求进度条
*/

import axios from "axios";
import NProgress from "nprogress";
import "nprogress/nprogress.css";

// axios.create()返回值，
// 简单理解就是Axios实例，就是axios对象
// request就是axios
const request = axios.create({
  // 配置对象
  // 将来使用request发送请求，会默认添加的内容
  /*
    基础路径

    将来使用request发送请求 request({ url: '/xxx' })
    实际发送请求时，地址由：baseURL + url 组成
    实际请求地址：/api/xxx
  */
  baseURL: "/mock", // 1. 复用请求地址前缀
  timeout: 10000, // 请求超时时间
  // headers: {
  // 公共请求头
  // },
});

/*
  一旦使用request发送请求，发送请求的流程：
    1. 请求拦截器设置的回调函数
      得到参数：发送请求的配置对象
      返回数据：发送请求的配置对象
    2. request内部会发送请求（此时服务器就会接受到请求）
      得到参数：发送请求的配置对象
      返回数据：服务器响应的结果
    3. 响应拦截器设置的回调函数
      得到参数：服务器响应的结果
      返回数据：数据
    4. async await后面代码
      得到参数：数据
*/

// 请求拦截器
request.interceptors.request.use(
  // 成功
  (config) => {
    // 开始进度条
    NProgress.start();
    // （设置）复用公共请求参数
    // config就是请求的配置对象
    // config.params.xxx = xxx
    // config.data.xxx = xxx
    // config.headers.xxx = xxx
    return config;
  }
  // 失败
  // () => {}
);

// 响应拦截器
request.interceptors.response.use(
  // 看响应状态码  2xx成功  非2xx失败
  // 请求成功 - 成功
  (response) => {
    // 结束进度条
    NProgress.done();
    // response就是服务器的响应结果
    if (response.data.code === 200) {
      return response.data.data;
    } else {
      // 功能失败
      alert(response.data.message);
      return Promise.reject(response.data.message);
    }
  },
  // 请求失败 - 失败
  (error) => {
    // 结束进度条
    NProgress.done();
    alert(error);
    return Promise.reject(error);
  }
);

export default request;
